iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

TypeScript 從0開始系列 第 11

D11 - Todo list with typescript

  • 分享至 

  • xImage
  •  
import { v4 as uuidV4 } from 'uuid'
// npm i --save-dev @types/uuid

type Todo = {
  id: string,
  title: string,
  completed: boolean,
  createdAt: Date
}

// const todoList = document.querySelector<HTMLUListElement>("#listTodo")
// const inputTodo = document.querySelector<HTMLInputElement>("#inputTodo");
// const formAddTodo = document.querySelector<HTMLFormElement>("#formAddTodo")

const listTodo = document.getElementById("listTodo") as HTMLUListElement | null;
const inputTodo = document.getElementById("inputTodo") as HTMLInputElement | null;
const formAddTodo = document.getElementById("formAddTodo") as HTMLFormElement | null;
const todos: Todo[] = loadTodos()

todos.forEach((todo) => {
  addTodo(todo)
})

formAddTodo?.addEventListener("submit", e => {
  e.preventDefault()
  
  if (inputTodo?.value == null || inputTodo?.value == "") {
    console.log("empty input")
    return
  }

  const todo: Todo = {
    id: uuidV4(),
    title: inputTodo.value,
    completed: false,
    createdAt: new Date()
  }

  todos.push(todo);

  addTodo(todo)

  inputTodo.value = ""
})
 



function addTodo(todo: Todo) {
  const item = document.createElement("li")
  const label = document.createElement("label")
  const checkbox = document.createElement("input")
  checkbox.type = "checkbox"
  checkbox.checked = todo.completed;

  checkbox.addEventListener("change", () => {
    todo.completed = checkbox.checked
    console.log(todo)
    console.log(todos)
    saveTodos(todos)
  })


  label.append(checkbox, todo.title)
  item.append(label)
  listTodo?.append(item)
  saveTodos(todos)
} 

function saveTodos(todos: Todo[]) {
  localStorage.setItem("TODOS", JSON.stringify(todos))
}

function loadTodos(): Todo[] {
  const todos = localStorage.getItem("TODOS")
  
  if (todos == null) return []
  else return JSON.parse(todos);
}

上一篇
D10 - JS debugger, class
下一篇
D12 - Todo list with React
系列文
TypeScript 從0開始21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言